package com.xxxx.crm.interceptor;

/**
 * Created by HMF on 2021/07/21 12:18
 */

import com.xxxx.crm.dao.UserMapper;
import com.xxxx.crm.exceptions.NoLoginException;
import com.xxxx.crm.utils.LoginUserUtil;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 非法访问拦截
 */
public class NoLoginInterceptor extends HandlerInterceptorAdapter { // 继承HandlerInterceptorAdapter适配器

    // 注入UserMapper
    @Resource
    private UserMapper userMapper;

    /**
     * 拦截判断用户是否是登录状态：
     * --在目标方法（目标资源）执行前，执行的方法
     * <p>
     * 返回 boolean 类型：
     * --如果返回true，表示目标方法可以被执行
     * --如果返回false，表示阻止目标方法执行
     * <p>
     * 如何判断用户是否是登录状态：
     * --1.判断cookie中是否存在用户信息（获取用户ID）
     * --2.数据库中是否存在指定用户ID的值
     * <p>
     * 如果用户是登录状态，则允许目标方法执行；
     * 如果用户是非登录状态，则抛出自定义的未登录异常 NoLoginException
     * （还需要在全局异常中做判断，如果是未登录异常，则跳转到登录页面）
     *
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        // 获取cookie中的用户ID，因为请求服务器时，浏览器会携带cookie数据，所以这里就可以获取到cookie中的Id
        Integer userId = LoginUserUtil.releaseUserIdFromCookie(request); // 使用封装好的方法从浏览器传回的cookie中获取userId
        // 判断用户Id是否为空，且数据库中存在该ID的用户记录
        if (userId == null || userMapper.selectByPrimaryKey(userId) == null) {
            // 抛出未登录异常
            throw new NoLoginException();
        }
        return true;
    }
}
